package lq3447;

import java.util.Scanner;

public class Main {
	// 定义m n
	static int m, n;
	// 定义二维字符数组记录迷宫
	static char[][] c;
	// 定义记录答案的变量sum
	static int sum;
	// 定义一个二维数组，记录马儿走日子的八个方向
	static int[][] d = { { -2, -2, 2, 2, 1, -1, 1, -1 }, { 1, -1, 1, -1, 2, 2, -2, -2 } };

	// 用布尔类型的数组记录是否访问过
	static boolean[][] v;
			
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();
		// 初始化char数组
		c = new char[n][m];
		// 输入String后再吧字符，再把字符输入在char中
		for (int i = 0; i < n; i++) {
			String s = sc.next();// 读取每一行的内容
			for (int j = 0; j < m; j++) {
				c[i][j] = s.charAt(j);// 根据索引将字符提取出来
			}
		}
		
		v = new boolean[n][m];// 初始的数据是false
		 
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (c[i][j] == 'S') {
					// 若遇到字符为 'S' 且尚未访问过的点，则进行深度优先搜索
					dfs(i, j);
					break;
				}
			}
		}
		System.out.println(sum);
	}

	// DFS方法
	public static void dfs(int x, int y) {
		// 如果x<0 y<0 x>n y<m 则说明这个点在田地之外
		if (x < 0 || y < 0 || x > n || y > m) {
			return;
		}
		
		//因为是在探索全部可走路线，走过的不再走，不回溯
		//记录是否访问过的数组不回溯
		v[x][y] = true;
		if (c[x][y] == 'b') {
			sum++;
		}
		// 循环所有可以走的点，并且判断点是否合法并且不等于X
		for (int i = 0; i < 8; i++) {
			int xx = x + d[0][i]; // 计算下一个点的 x 坐标
			int yy = y + d[1][i]; // 计算下一个点的 y 坐标
			if (xx >= 0 && yy >= 0 && xx < n && yy < m && !v[xx][yy] && c[xx][yy] != 'x') {
				// 判断下一个点是否满足条件（未越界、未访问过、不是 'x'）
				dfs(xx, yy); // 递归搜索下一个点
			}
		}

	}
}